from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import relationship, backref

from sqlalchemy import create_engine
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import Float
from sqlalchemy import Date
from sqlalchemy import String
from sqlalchemy import ForeignKey

import servers

host=servers.host
user=servers.user
passwd=servers.passwd
db_name=servers.db_name

engine = create_engine('mysql+mysqldb://%s:%s@%s/%s' % (user, passwd, host, db_name))
Session = sessionmaker(bind=engine)

Base = declarative_base()
class Color(Base):
    __tablename__ = 'colores'
    idcolor = Column(Integer, primary_key=True)
    nombre = Column(String)
    
    def __init__(self, idcolor, nombre):
        self.idcolor = idcolor
        self.nombre = nombre
        
    #def __repr__(self):
    #   return ""
   
class Sucursal(Base):
    __tablename__ = 'sucursales'
    idsucursal = Column(Integer, primary_key=True)
    codsucursal = Column(String)
    nombre = Column(String)
    telefono = Column(String)
    encargada = Column(String)
    activa = Column(String)
    com = Column(String)
    
    def __init__(self, idsucursal, codsucursal, nombre, telefono, encargada, activa, com):
        self.idsucursal = idsucursal    
        self.codsucursal = codsucursal
        self.nombre = nombre
        self.telefono = telefono
        self.encargada = encargada
        self.activa = activa
        self.com = com

class Vendedora(Base):
    __tablename__ = 'vendedoras'
    idvendedora = Column(Integer, primary_key=True)
    nombre = Column(String)
    sucursal = Column(Integer, ForeignKey('sucursales.idsucursal'))
    sucursal_rel = relationship(Sucursal, backref=backref('vendedoras', order_by=idvendedora))        
    
    def __init__(self, idvendedora, nombre):
        self.idvendedora = idvendedora
        self.nombre = nombre
        


######################################
class Grupo(Base):
    __tablename__ = 'grupos'
    idgrupo = Column(String, primary_key=True)
    nombregrupo = Column(String)

    def __init__(self, idgrupo, nombregrupo):
        self.idgrupo = idgrupo
        self.nombregrupo = nombregrupo

class Proveedor(Base):
    __tablename__ = 'proveedor'
    idproveedor = Column(String, primary_key=True)
    nombre = Column(String)

    def __init__(self, idproveedor, nombre):
        self.idproveedor = idproveedor
        self.nombre = nombre
        
class Producto(Base):
    __tablename__ = 'productos'
    codsussan = Column(String, primary_key=True)
    proveedor = Column(String, ForeignKey('proveedor.idproveedor'))
    proveedor_rel = relationship(Proveedor)
    descri = Column(String)
    anio = Column(String)
    grupo = Column(String, ForeignKey('grupos.idgrupo'))
    grupo_rel = relationship(Grupo)    

    def __init__(self):
        pass     

class PTC(Base):
    __tablename__ = 'producto_talle_color'
    id = Column(String, primary_key=True)
    codsussan = Column(String, ForeignKey('productos.codsussan'))
    producto = relationship(Producto)
    talle = Column(String)
    color = Column(String)
    
    def __init__(self):
        pass

class Venta(Base):
    __tablename__ = 'ventas'
    idventa = Column(String, primary_key=True)
    nrofactura = Column(Integer)
    fecha = Column(Date)
    hora = Column(String)
    #TODO: FALTA RELACION CON CLIENTE
    idcliente = Column(String)
    idlistaprecio = Column(Integer)
    idformaticket = Column(Integer)
    totalfactura = Column(Float)
    turno = Column(String)
    sucursal = Column(Integer, ForeignKey('sucursales.idsucursal'))
    sucursal_rel = relationship(Sucursal, backref=backref('ventas', order_by=idventa)) 
    
    usuario = Column(String, ForeignKey('vendedoras.idvendedora'))
    usuario_rel = relationship(Vendedora, backref=backref('ventas', order_by=idventa))
    
    auditoria = Column(Date)
    descuento = Column(Float)
    iva = Column(Float)
    totalsiniva = Column(Float)
    
    def __init__(self):
        pass

class VentaPagos(Base):
    __tablename__ = 'ventastienepagos'
    idventa = Column(String, ForeignKey('ventas.idventa'), primary_key=True)
    venta = relationship(Venta, backref=backref('pagos'))
    
    nrofactura = Column(Integer)
    fecha = Column(Date)
    idformapagos = Column(String, primary_key=True)
    descrivalor = Column(String)
    monto = Column(Float)
    cuotas = Column(Integer)
    idformapagos = Column(String)
    #nrorecibo = Column(String)
    #vendedora = Column(String)
    
    def __init__(self):
        pass

class VentaItem(Base):
    __tablename__ = 'ventastieneproductos'
    idticket = Column(String, ForeignKey('ventas.idventa'), primary_key=True)
    venta = relationship(Venta, backref=backref('items'))
    
    nrofactura = Column(Integer)
    ptc = Column(String, ForeignKey('producto_talle_color.id'), primary_key=True)
    ptc_rel = relationship(PTC, primaryjoin=ptc == PTC.id)
    
    descri = Column(String)
    talle = Column(String)
    color = Column(String)
    cantidad = Column(Integer)
    preciolista = Column(Float)
    descuento = Column(Float)
    preciofinal = Column(Float)
    sucursal = Column(Integer, ForeignKey('sucursales.idsucursal'))
    
    idformaticket = Column(Integer)
    usuario = Column(String, ForeignKey('vendedoras.idvendedora'))
    #usuario_rel = relationship(Vendedora)
    
    auditoria = Column(Date)
    devuelto = Column(Float)
    
    def __init__(self):
        pass

class Club(Base):
    __tablename__ = 'club'
    id = Column(String, primary_key=True)
    idcliente = Column(String)
    idcategoria = Column(String)
    estado = Column(String)
    fechasolicitud = Column(Date)
    fechaentrega = Column(Date)
    sucursal = Column(Integer, ForeignKey('sucursales.idsucursal'))
    sucursal_rel = relationship(Sucursal) 
        
    def __init__(self):
        pass     

class ClubPuntos(Base):
    __tablename__ = 'club_puntos'
    id = Column(String, primary_key=True)
    idclub = Column(String, ForeignKey('club.id'))
    idcliente = Column(String)
    nrofactura = Column(String)
    montocompra = Column(Float)
    fecha = Column(Date)
    puntos_nuevos = Column(Integer)
    puntos_gastados = Column(Integer)
    puntos = Column(Integer)
    saldo = Column(Integer)
    observacion = Column(String)
    
    club_rel = relationship(Club, backref=backref('clubpuntos', order_by=fecha))
        
    def __init__(self):
        pass           
        
class Valor(Base):
    __tablename__ = 'valores'
    nombre = Column(String, primary_key=True)
    descripcion = Column(String)
    valor = Column(Integer)
    tipo = Column(Integer)
    tipoVenta = Column(Integer)
    
    def __init__(self):
        pass

class Rule(Base):
    __tablename__ = 'com_rules'
    id = Column(String, primary_key=True)
    name = Column(String)
    points = Column(Integer)
    
    year = Column(Integer)
    month = Column(Integer)
    
    specs = relationship('RuleSpec', backref=backref('rule_rel'), cascade="all, delete, delete-orphan")

    def __init__(self, id, name, points, year, month):
        self.id = id
        self.name = name
        self.points = points
        self.year = year
        self.month = month
        
class RuleSpec(Base):
    __tablename__ = 'com_rulespecs'
    id = Column(String, primary_key=True)
    idrule = Column(String, ForeignKey('com_rules.id'))
    #rule_rel = relationship(Rule, backref=backref('specs'), cascade="all, delete, delete-orphan")
    
    f = Column(Integer)
    t = Column(Integer)
    amount = Column(Float)
    year = Column(Integer)
    month = Column(Integer)
    type = Column(String)
    
    elements = relationship('RuleSpecElement', backref=backref('rulespec'), cascade="all, delete, delete-orphan")

    def __init__(self, id, f, t, amount, year, month, type):
        self.id = id
        self.f = f
        self.t = t
        self.amount = amount
        self.year = year
        self.month = month
        self.type = type       

class RuleSpecElement(Base):
    __tablename__ = 'com_rulespec_elements'
    idrulespec = Column(String, ForeignKey('com_rulespecs.id'), primary_key=True)
    #rulespec = relationship(RuleSpec, backref=backref('elements'), primaryjoin=idrulespec == RuleSpec.id)
    
    name = Column(String, primary_key=True)

    def __init__(self, name):
        self.name = name
        
def create_session():
    return Session()